import axios from 'axios'
import qs from 'qs'

const FILE_TYPE = [
  'image/jpeg', // JPG图片
  'image/jpg', // JPG图片
  'image/png', // PNG图片
  'image/bmp', // BMP图片
  'image/webp', // WEBP图片
  'image/svg+xml', // SVG图片
  'image/tiff', // TIFF图片
  'image/gif', // GIF图片
  'application/octet-stream', // 二进制流文件
  'application/pdf', // PDF文件
  'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', // XLSX文件
  'application/ms-excel', // XLSX文件
  'application/vnd.ms-excel', // XLS文件
  'application/vnd.openxmlformats-officedocument.wordprocessingml.document', // DOCX文件
  'application/msword', // DOC文件
  'application/vnd.ms-word' // DOC文件
]

export default function request(options) {
  return new Promise((resolve, reject) => {
    // 请求头
    const headers = {
      'Content-Type':
        options.method === 'post'
          ? 'application/x-www-form-urlencoded; charset=UTF-8'
          : 'application/json; charset=UTF-8',
      ...options.config?.headers
    }

    // 创建axios实例
    const service = axios.create({
      baseURL: options.url.includes('http')
        ? options.url
        : process.env.VUE_APP_baseUrl, // baseURL将会被加在url前面。
      timeout: 10000, // 超时
      withCredentials: true, // 是否允许带cookie这些
      processData: true,
      ...options.config,
      headers
    })

    // request拦截器
    service.interceptors.request.use(
      async (config) => {
        if (config.method === 'post' && config.processData) {
          config.data = qs.stringify(config.data)
        }

        return config
      },
      (error) => {
        Promise.reject(error)
      }
    )

    // 响应拦截器
    service.interceptors.response.use(
      (res) => {
        const handleErrCode = res.data.code

        if (handleErrCode === '10000' || res.data.status === true) {
          resolve(res.data)
        } else if (
          FILE_TYPE.filter((i) => res.headers['content-type'].includes(i))
            .length
        ) {
          resolve(res.data)
        } else {
          reject(res.data)
        }
      },
      (error) => {
        let { message } = error

        if (message == 'Network Error') {
          message = '网络异常，请检查网络'
        } else if (message.includes('timeout')) {
          message = '系统接口请求超时，请检查网络'
        } else if (message.includes('Request failed with status code')) {
          message = '系统接口' + message.substr(message.length - 3) + '异常'
        }

        return reject(error)
      }
    )

    service(options)
  })
}
